package dynamicJsonVerifyer;

import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;

import java.util.Objects;
import java.util.Set;

@Component
public class VerifyerSelecter {


    /*
     * 两个大路线：
     * 1、多个校验器组合校验。
     * 2、一个层层继承下的强大校验器单独校验。（当然有时候也可能就是一个简单的数据类型校验）
     * 目前用第二种，单校验器。
     */


    /**
     * 根据字段校验元数据，获取对应的校验器
     * @param fieldMetadata
     * @return
     */
    public FieldVerifyer get(JSONObject fieldMetadata){

        /*
         * 这种策略只是大概率正确的！！
         */

        int maxScore = 0;
        int currScore = 0;
        FieldVerifyer maxScoreVerify = null;
        /*
         * 暂时只支持使用第一层数据进行匹配
         */
        Set<FieldVerifyer> set = VerifyConfiguration.getFieldVerifyerSet();
        for(FieldVerifyer verifyer : set){
            /*
             * 校验器的匹配数据
             */
            JSONObject matchJson = verifyer.getVerifyerMatchData();
            /*
             * 校验器是否匹配
             */
            boolean isMatch = true;

            /*
             * 判断verifyer的是否匹配及分数
             */
            for(String matchKey : matchJson.keySet()){
                Object correctValue = matchJson.get(matchKey);
                Object realityValue = fieldMetadata.get(matchKey);

                if (Objects.equals(correctValue, realityValue)){
                    currScore += 10;
                } else if(correctValue==Const.notNull && realityValue!=null){
                    currScore += 5;
                }else {
                    isMatch = false; break;
                }
            }

            if(isMatch){
                if(currScore>=maxScore){
                    maxScoreVerify = verifyer;
                    maxScore = currScore;
                }
            }

            currScore = 0;
        }

        return maxScoreVerify;
    }
}
